終於可以開始寫點程式了。我問問自己想要做一個部落格,最小的結構是什麼?
我有想到我不想 Over Design 或 Poor Design,像是一個人住我只要一個玩具箱,就可以放滿目前的玩具。
我在設計自己的部落格,我有一些想法讓自己的程式碼更容易被看懂,更可以維護。當然希望在最簡單的設計裡面。
AI 給了我一個三明治(三層式)的架構,
資料存取層(Data Layer):data
商業邏輯層(Business Layer):domain、usecases
展示層(Presentation Layer):presentation/http
另外我希望自己做完的功能可以在每次變動中不會改動之後就壞掉,就像學校會考試來確定我們會什麼或不會什麼,1 + 1 等於多少?,ㄍㄨㄛˊ 語的「國」寫?。 所以用了一個方法叫做 TDD 測試驅動開發 (Test-Driven Development) 。
AI 先幫我見了一個 tests 資料夾,並搭配 vitest 。
一開始就可以先讓 AI 幫我測試功能可不可以用了,完全跟服務或整個架構是分開的。很有趣。
TDD 除了最基本的是「紅燈、綠燈、重構」循環。
所以應該要先產生紅燈
這是是測試
import { describe, it, expect } from 'vitest';
import { InMemoryArticleRepository } from '../src/data/InMemoryArticleRepository';
import { BlogService } from '../src/usecases/BlogService';
describe('BlogService(邏輯層)', () => {
it('可以新增文章,並依分類查詢(最小可用)', () => {
const repo = new InMemoryArticleRepository();
const blog = new BlogService(repo);
blog.addArticle({ title: 'AI 幫我寫的遊記', category: '旅行' });
blog.addArticle({ title: '用 AI 學程式心得', category: '學習' });
blog.addArticle({ title: '九份散步', category: '旅行' });
const travel = blog.getByCategory('旅行');
expect(travel.map(a => a.title)).toEqual(['AI 幫我寫的遊記', '九份散步']);
});
});
這裡是部分的程式碼
import type { Article } from '../domain/Article';
import type { ArticleRepository } from '../data/ArticleRepository';
export class BlogService {
constructor(private repo: ArticleRepository) {}
addArticle(article: Article) {
//功能還沒實作
}
getByCategory(category: string): Article[] {
//功能還沒實作
return [];
}
}
現在還缺什麼?服務的監聽器?資料庫?還沒寫上去的邏輯功能?
這已經是一個基本的架構了嗎?